package main

import (
	"fmt"
	"io"
)

// A Reader implements the io.Reader ...
// type Reader struct {
//     s        string
//     i        int64 // current reading index
//     prevRune int   // index of previous rune; or < 0
// }

// func strings.NewReader(s string) *strings.Reader

type NewReader struct {
	s string
	i int
}

// 把string 放入 []byte
// 									返回变量放这里，函数内部就不用声明了
func (nr *NewReader) Read(p []byte) (n int, err error) {
	if len(p) == 0 {
		return 0, nil
	}
	n = copy(p, nr.s[nr.i:])
	// var err error
	if nr.i += n; nr.i >= len(nr.s) {
		err = io.EOF
		// return n, io.EOF
	}
	// fmt.Printf("n=%d, nr.i=%d\n", n, nr.i)

	// 可以直接return
	// return n, err
	return
}

func StringsNewReader(s string) *NewReader {
	var nr NewReader
	nr.s = s
	return &nr
}

func main() {
	nr := StringsNewReader("hello world")
	// fmt.Println(nr.s)
	data := make([]byte, 10)
	// var n int
	// var err error
	n, err := nr.Read(data[:0])
	for err == nil {
		n, err = nr.Read(data)
		fmt.Println(err, "  ", n, string(data[0:n]))
	}
}
